using System;
using System.Windows.Forms;
using Fornax020.SerialCommunication;

namespace Fornax020
{
    /// <summary>
    /// Form1使用新架构的示例代码
    /// 这个文件展示了如何在UI层使用新的串口通信架构
    /// </summary>
    public partial class Form1UsageExample
    {
        #region 私有字段 - 依赖注入
        private SerialCommunicationManager _serialManager;
        private IDataParser _dataParser;
        #endregion

        #region 初始化方法
        /// <summary>
        /// 初始化串口通信组件
        /// 依赖注入：将依赖的对象注入到类中
        /// </summary>
        private void InitializeSerialCommunication()
        {
            // 创建串口管理器
            _serialManager = new SerialCommunicationManager();
            
            // 创建数据解析器
            _dataParser = new XRayDeviceDataParser();

            // 订阅事件 - 观察者模式
            _serialManager.DataReceived += OnDataReceived;
            _serialManager.ConnectionStatusChanged += OnConnectionStatusChanged;
            _serialManager.ErrorOccurred += OnErrorOccurred;
        }
        #endregion

        #region 事件处理方法 - 观察者模式的具体实现
        /// <summary>
        /// 数据接收事件处理
        /// 观察者模式：响应串口管理器的数据接收事件
        /// </summary>
        private void OnDataReceived(object sender, DataReceivedEventArgs e)
        {
            // 使用策略模式解析数据
            var parsedData = _dataParser.Parse(e.DataString);

            if (parsedData.IsValid)
            {
                // 根据解析结果更新UI
                UpdateUIWithParsedData(parsedData);
            }
        }

        /// <summary>
        /// 连接状态变化事件处理
        /// </summary>
        private void OnConnectionStatusChanged(object sender, ConnectionStatusEventArgs e)
        {
            // 更新连接状态显示
            if (e.IsConnected)
            {
                // 更新UI显示已连接
                UpdateConnectionStatus(true);
            }
            else
            {
                // 更新UI显示未连接
                UpdateConnectionStatus(false);
            }
        }

        /// <summary>
        /// 错误事件处理
        /// </summary>
        private void OnErrorOccurred(object sender, ErrorEventArgs e)
        {
            // 显示错误信息
            MessageBox.Show(e.ErrorMessage, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        #endregion

        #region UI更新方法
        /// <summary>
        /// 根据解析的数据更新UI
        /// 单一职责原则：专门负责UI更新
        /// </summary>
        private void UpdateUIWithParsedData(ParsedData data)
        {
            switch (data.CommandType)
            {
                case "VP":
                    // 更新KV显示
                    UpdateKvDisplay(data.KvValue);
                    break;

                case "CP":
                    // 更新MA显示
                    UpdateMaDisplay(data.MaValue);
                    break;

                case "MO":
                    // 更新监控数据显示
                    UpdateMonitorDisplay(data.MonitorData);
                    break;

                case "ER":
                    // 显示错误信息
                    ShowError(data.ErrorCode);
                    break;

                case "GR":
                    // 更新固件版本显示
                    UpdateFirmwareVersion(data.FirmwareVersion);
                    break;

                case "DEFAULT":
                    // 处理默认格式数据
                    UpdateKvMaFeedback(data.KvValue, data.MaValue);
                    break;
            }
        }

        /// <summary>
        /// 更新KV显示
        /// </summary>
        private void UpdateKvDisplay(double kvValue)
        {
            // 这里更新KV显示控件
            // kvDisplayTextBox.Text = kvValue.ToString("0.#");
        }

        /// <summary>
        /// 更新MA显示
        /// </summary>
        private void UpdateMaDisplay(double maValue)
        {
            // 这里更新MA显示控件
            // maDisplayTextBox.Text = maValue.ToString();
        }

        /// <summary>
        /// 更新监控数据显示
        /// </summary>
        private void UpdateMonitorDisplay(string monitorData)
        {
            // 这里更新监控数据显示控件
        }

        /// <summary>
        /// 显示错误信息
        /// </summary>
        private void ShowError(string errorCode)
        {
            // 这里显示错误信息
            // errorTextBox.Text = errorCode;
        }

        /// <summary>
        /// 更新固件版本显示
        /// </summary>
        private void UpdateFirmwareVersion(string firmwareVersion)
        {
            // 这里更新固件版本显示
            // this.Text = $"Fornax020 GUI 1.0.0 | Firmware {firmwareVersion}";
        }

        /// <summary>
        /// 更新KV和MA反馈显示
        /// </summary>
        private void UpdateKvMaFeedback(double kvValue, double maValue)
        {
            // 这里更新KV和MA反馈控件
            // kvFeedbackTextBox.Text = kvValue.ToString("0.0");
            // maFeedbackTextBox.Text = maValue.ToString("0.0");
        }

        /// <summary>
        /// 更新连接状态显示
        /// </summary>
        private void UpdateConnectionStatus(bool isConnected)
        {
            // 这里更新连接状态显示
            if (isConnected)
            {
                // connectionStatusLabel.Text = "已连接";
                // statusIndicator.BackColor = Color.Green;
            }
            else
            {
                // connectionStatusLabel.Text = "未连接";
                // statusIndicator.BackColor = Color.Red;
            }
        }
        #endregion

        #region 命令执行方法 - 命令模式的使用
        /// <summary>
        /// 设置KV值
        /// 命令模式：将操作封装为命令对象
        /// </summary>
        private void SetKvValue(double kvValue)
        {
            var command = SerialCommandFactory.CreateSetKvCommand(kvValue);
            bool success = command.Execute(_serialManager);
            
            if (!success)
            {
                MessageBox.Show("设置KV值失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 设置MA值
        /// </summary>
        private void SetMaValue(double maValue)
        {
            var command = SerialCommandFactory.CreateSetMaCommand(maValue);
            bool success = command.Execute(_serialManager);
            
            if (!success)
            {
                MessageBox.Show("设置MA值失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 开始曝光
        /// </summary>
        private void StartExposure()
        {
            var command = SerialCommandFactory.CreateStartExposureCommand();
            bool success = command.Execute(_serialManager);
            
            if (success)
            {
                // 更新曝光指示器
                SetExposureIndicator(true);
            }
            else
            {
                MessageBox.Show("开始曝光失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 停止曝光
        /// </summary>
        private void StopExposure()
        {
            var command = SerialCommandFactory.CreateStopExposureCommand();
            bool success = command.Execute(_serialManager);
            
            if (success)
            {
                // 更新曝光指示器
                SetExposureIndicator(false);
            }
            else
            {
                MessageBox.Show("停止曝光失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 清除错误
        /// </summary>
        private void ClearError()
        {
            var command = SerialCommandFactory.CreateClearErrorCommand();
            command.Execute(_serialManager);
        }

        /// <summary>
        /// 设置曝光指示器状态
        /// </summary>
        private void SetExposureIndicator(bool isExposing)
        {
            // 这里更新曝光指示器
            if (isExposing)
            {
                // exposureIndicator.BackColor = Color.Yellow;
            }
            else
            {
                // exposureIndicator.BackColor = Color.Gray;
            }
        }
        #endregion

        #region 资源清理
        /// <summary>
        /// 清理资源
        /// </summary>
        private void Cleanup()
        {
            // 取消事件订阅
            if (_serialManager != null)
            {
                _serialManager.DataReceived -= OnDataReceived;
                _serialManager.ConnectionStatusChanged -= OnConnectionStatusChanged;
                _serialManager.ErrorOccurred -= OnErrorOccurred;
                
                // 释放资源
                _serialManager.Dispose();
            }
        }
        #endregion
    }
}
